import java.util.ArrayList;
import java.util.List;

public class SpiralOrder {

    List<Integer> ans = new ArrayList<>();
    public List<Integer> spiralOrder(int[][] matrix) {
        int a = 0;
        int b = 0;
        int n = matrix.length - 1;
        int m = matrix[0].length - 1;
        while (a <= n && b <= m) {
            process(matrix, a++, b++, n--, m--);
        }
        return ans;
    }

    public void process(int[][] nums, int a, int b, int n, int m) {
        if (a == n) {
            for (int i = b; i < m + 1; i++) {
                ans.add(nums[a][i]);
            }
        } else if (b == m) {
            for (int i = a; i < n + 1; i++) {
                ans.add(nums[i][m]);
            }
        } else {
            int x = a;
            int y = b;
            while (y <= m) {
                ans.add(nums[x][y++]);
            }
            x++;
            y--;
            while (x <= n) {
                ans.add(nums[x++][y]);
            }
            y--;
            x--;
            while (y >= b) {
                ans.add(nums[x][y--]);
            }
            x--;
            y++;
            while (x > a) {
                ans.add(nums[x--][y]);
            }
        }
    }
}
